package com.springboot.test.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.springboot.test.common.exception.BizException;
import com.springboot.test.common.enums.ErrorCode;
import com.springboot.test.common.utils.IdGenerator;
import com.springboot.test.entity.GoodsTypeEntity;
import com.springboot.test.entity.mapper.GoodsTypeMapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class GoodsTypeService extends ServiceImpl<GoodsTypeMapper, GoodsTypeEntity> {
    public List<GoodsTypeEntity> listByCodes(List<String> codes){
       return list(new QueryWrapper<GoodsTypeEntity>().lambda().in(GoodsTypeEntity::getGoodsTypeCode,codes));
    }

    public GoodsTypeEntity getOneByCode(String goodsTypeCode){
        return getOne(new QueryWrapper<GoodsTypeEntity>().lambda().eq(GoodsTypeEntity::getGoodsTypeCode,goodsTypeCode));
    }


    public List<GoodsTypeEntity> listByCodesAndLevel(Integer level,String parentCode){
        List<GoodsTypeEntity> list = list(new QueryWrapper<GoodsTypeEntity>().lambda()
                .eq(GoodsTypeEntity::getLevel,level).eq(StringUtils.isNotBlank(parentCode),GoodsTypeEntity::getParentTypeCode,parentCode));
        return list;
    }

    public void add(String name,String parentCode){
        GoodsTypeEntity goodsTypeEntity = getOne(new QueryWrapper<GoodsTypeEntity>().lambda().eq(GoodsTypeEntity::getGoodsType, name));
        if(goodsTypeEntity != null){
            throw new BizException(ErrorCode.GOODS_TYPE_EXIST);
        }
        goodsTypeEntity = new GoodsTypeEntity();
        goodsTypeEntity.setGoodsType(name);
        goodsTypeEntity.setGoodsTypeCode(IdGenerator.getNewId("T"));
        if(StringUtils.isNotBlank(parentCode)){
            goodsTypeEntity.setParentTypeCode(parentCode);
            goodsTypeEntity.setLevel(2);
        }else {
            goodsTypeEntity.setLevel(1);
        }
        save(goodsTypeEntity);
    }

    public Integer typeCount() {
        return count(new QueryWrapper<GoodsTypeEntity>().lambda().eq(GoodsTypeEntity::getLevel,1));
    }
}
